<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category LIBRARY
   * @package LIBRARY/CORE/
   * @since 02/06/2012.
   * @last_update 02/06/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   * Uma solução para Zend_Controlller_Action_Helper_FlashMessenger
   */
  class Core_FlashMessage{
    /**
     * @const SUCCESS
     */
    const SUCCESS = 'success';

    /**
     * @const WARNING
     */
    const WARNING = 'warning';

    /**
     * @const NOTICE
     */
    const NOTICE = 'notice';

    /**
     * @const ERROR
     */
    const ERROR = 'error';

    /**
     * Saida Mensagem;
     * @var string
     */
    static protected $_wrapper = '<ul>%s</ul>';

    /**
     * Apresentação no template:
     * 1º argumento é a chave de indentificação do array
     * 2º argumento é a mensagem para apresentar
     * @var string
     *
     */
    static protected $_template = '<li class="%s">%s</li>';

    /**
     * Default key seted on 1st arg of template when message is not a array
     * Chave default definida no 1º argumento do template quando não há mensagem no array
     * @var string
     */
    static protected $_defaultKey = 'error';

    /**
     * FlashMessage
     * @var Zend_Controller_Action_Helper_FlashMessenger
     */
    static protected $_flashMessenger;


    /**
     * Chama o método addMessage, caso uma mensagem foi definida.
     * @param string   Mensagem que deverá aparecer ao usuário.
     */
    public function  __construct($message = null){
    	if($message){
    		self::addMessage($message);
    	}
    }

    /**
     * Chama o método addMesage do Zend_flashMessenger 
     * @param string Mensagem que deverá aparecer ao usuario
     * @param string Chave que definirá o tipo da mensagem. success, warning, notice, error
     * @return string
     */
    public static function addMessage($message, $messageKey = null){
    	switch($messageKey){
    		case 1:
    			$key = self::SUCCESS;
    		break;
    		
    		case 2:
    			$key = self::WARNING;
    		break;
    		
    		case 3:
    			$key = self::NOTICE;
    		break;
    		
    		case 4:
    			$key = self::ERROR;
    		break;
    			
    		default:
    			$key = self::$_defaultKey;			
    		break;		 
    	}
    	
    	/*if(null == $messageKey ){
    		$messageKey = self::$_defaultKey;
    	}
    	
    	$message = array(
        $messageKey => $message
      ); */
    	
    	$message = array(
        $key => $message
      );
      
      $flashMessenger = self::_getFlashMessenger();
      
      return $flashMessenger->addMessage($message);
    }

    /**
     * Limpa a mensagem corrente
     */
    public static function clearCurrentMessages(){
        $flashMessenger = self::_getFlashMessenger();
        $flashMessenger->clearCurrentMessages();
    }


    /**
     * Mostra a mensagem ao usuário.
     *
     * @return string.
     */
    public function render(){
    	$flashMessenger = $this->_getFlashMessenger();
    	
    	//Recebe a mensagem a partir de solicitações anteriores
    	$messages = $flashMessenger->getMessages();
    	
    	//Adiciona quaisquer mensagem desta requisição.
    	if($flashMessenger->hasCurrentMessages()){
    		$messages = array_merge($messages, $flashMessenger->getCurrentMessages());
    		
    		//Não precisamos exibi-la duas vezes.
    		$flashMessenger->clearCurrentMessages();
    	}
    	
    	$output ='';
    	foreach($messages as $message){
    		if(is_array($message)){
    			list($messageKey, $message) = each($message);
    		} 
    		else{
    			$messageKey = self::$_defaultKey;
    		}
    		
    		$output .= sprintf(self::$_template, $messageKey, $message);
    	}
    	if($output){
    		$output = sprintf(self::$_wrapper, $output);
    	}
    	return $output;
    }

    /**
     * Instancia o objeto FlashMessage.
     *
     * @return Zend_Controller_Action_Helper_FlashMessenger
     */
    protected static function _getFlashMessenger(){
    	if(null === self::$_flashMessenger){ 
    		self::$_flashMessenger = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger');
    	}
    	return self::$_flashMessenger;
    }

    /**
     * Método mágico toString
     * @return string
     */
    public function  __toString(){
    	return $this->render();
    }
  }